let path = require("path");
let HtmlWebpackPlugin = require("html-webpack-plugin");
let MiniCssExtractPlugin = require("mini-css-extract-plugin");
let OptimizeCssAssetsWebpackPlugin = require("optimize-css-assets-webpack-plugin");
let TerserJSPlugin = require("terser-webpack-plugin");
let webpack = require("webpack");

let { CleanWebpackPlugin } = require("clean-webpack-plugin");
let CopyWebpackPlugin = require("copy-webpack-plugin");

module.exports = {
  optimization: {
    minimizer: [new OptimizeCssAssetsWebpackPlugin(), new TerserJSPlugin()],
  },
  // 解析, 第三方包 common
  resolve: {
    modules: [path.resolve("node_modules")],
    // 别名 vue -> vue.runtime
    alias: {
      bootstrap: "bootstrap/dist/css/bootstrap.css",
    },
    extensions: ['.js', '.css','.json','.vue'], // 不写后缀, 匹配规则
    mainFields: ["style", "main"], // 先去style,再去main文件
    mainFiles: [], // 入口文件的名字 index.js
  },
  // 跨域
  devServer: {
    // 1. 重写的方式, 把请求代理到express服务器上
    // proxy: {
    //   // '/api': 'http://localhost:3001', // 配置一个代理
    //   "/api": {
    //     target: "http://localhost:3001",
    //     pathRewrite: { "/api": "" },
    //   },
    // },
    // 2. 如果前端只想单纯来模拟数据
    // 提供的钩子函数
    // onBeforeSetupMiddleware({ app }) {
    //   app.get("/user", (req, res) => {
    //     res.json({ name: "前端小溪 -- 模拟数据" });
    //   });
    // },
    //  3. 前后端在一个项目里, 在服务端启动webpack, 将前端页面打包到服务端静态资源里
  },
  mode: "development", // 模式 默认两种 production development
  entry: "./src/index.js", // 入口
  devtool: "source-map",
  // devtool: "eval-source-map",
  // devtool: "cheap-module-source-map",
  // devtool: "eval-cheap-module-source-map",
  output: {
    filename: "index.js",
    path: path.resolve(__dirname, "dist"), // 路径必须是一个绝对路径
  },
  // watch: true,
  // watchOptions: {
  //   // 监控的选项
  //   poll: 1000, // 每秒
  //   aggregateTimeout: 500, // 防抖 持续输入不更新
  //   ignored: /node_modules/, // 不需要监控的文件
  // },
  // 数组 放着所有的webpack插件
  plugins: [
    new HtmlWebpackPlugin({
      template: "./src/index.html", // 模板
      filename: "index.html", // 文件名
      minify: {
        removeAttributeQuotes: true, // 删除index.html中的双引号
        collapseWhitespace: true, // 压缩成一行
      },
      // hash: true, // index.html引入脚本添加hash参数
    }),
    new webpack.DefinePlugin({
      // ENV: "'development'" 
      ENV: JSON.stringify('development'),
      FLAG: 'true',
      ADD: "1+1"
    }),
    new CleanWebpackPlugin(),
    // new CopyWebpackPlugin({
    //   patterns: [
    //     // "README.md"
    //     { from: "README.md", to: "./" },
    //   ],
    // }),
    // new webpack.BannerPlugin(
    //   "Copyright 2002-2022 the original author or authors.Licensed under the Apache License, Version 2.0 (the 'License');"
    // ),
    new MiniCssExtractPlugin({
      filename: "css/main.css",
    }),
  ],
  // 模块
  module: {
    // 规则
    rules: [
      {
        test: /\.js$/, // normal 普通的loader
        use: {
          // babel-loader 将ES6转ES5
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-env"],
            plugins: ["@babel/plugin-transform-runtime"],
          },
        },
        include: path.resolve(__dirname, "src"),
        exclude: /node_modules/,
      },
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader", "postcss-loader"],
      },
    ],
  },
};
